home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / hips / sources / lut / stretchtbl.c < prev   
Encoding:
C/C++ Source or Header  |  1992-04-04  |  4.2 KB  |  195 lines

  1. /*    Copyright (c) 1989 Michael Landy
  2.  
  3. Disclaimer:  No guarantees of performance accompany this software,
  4. nor is any responsibility assumed on the part of the authors.  All the
  5. software has been tested extensively and every effort has been made to
  6. insure its reliability.   */
  7.  
  8. /*
  9.  * stretchtbl.c - stretch or compress the range of gray-levels
  10.  *          in a byte-formatted frame.
  11.  *
  12.  * usage: stretchtbl [ exp1 [ boundary [ exp2 ]]] < oldframe > tbl_name
  13.  *
  14.  * defaults:  exp1:  2., boundary: .5, exp2: 1/exp1.
  15.  *
  16.  * to load: cc -o stretchtbl stretchtbl.c -lhips -lm
  17.  *
  18.  * Yoav Cohen 2/19/82
  19.  */
  20.  
  21. /*
  22.  * exponentiation bug fixed - WEJohnston 9/89
  23.  *
  24.  *  added support for short images and
  25.  *  modified to use look-up table for byte and short images:
  26.  *     Brian Tierney, LBL 10/90
  27.  */
  28.  
  29. #include <hipl_format.h>
  30. #include <math.h>
  31. #include <stdio.h>
  32.  
  33. unsigned char *pic;
  34. short    *spic;
  35.  
  36. #define MAXSHORT 32768
  37. #define UNDEFFLOAT -1.0
  38.  
  39. /* scaling values */
  40. double    midpt = UNDEFFLOAT;
  41. double    expt1, expt2;
  42. short     mval;            /* max value in a short image */
  43. int       midfract = 0;
  44.  
  45. main(argc, argv)
  46.     int       argc;
  47.     char    **argv;
  48.  
  49. {
  50.     struct header hd;
  51.     int       rc, form, maxmid;
  52.  
  53.     Progname = strsave(*argv);
  54.     read_header(&hd);
  55.     form = hd.pixel_format;
  56.     if (argv[argc - 1][0] == '-')
  57.     argc--;
  58.     expt1 = 2.;
  59.     if (argc > 1)
  60.     expt1 = atof(argv[1]);
  61.     if (argc > 2) {
  62.     midpt = atof(argv[2]);
  63.     if (midpt < 1.0)
  64.         midfract = 1;
  65.     if (form == PFBYTE)
  66.         maxmid = 255;
  67.     else
  68.         maxmid = MAXSHORT;
  69.     if (midpt <= 0 || midpt >= maxmid)
  70.         perr(HE_MSG, "boundary must be between 0 and 255");
  71.     }
  72.     fprintf(stderr, "here\n");
  73.     expt2 = 1. / expt1;
  74.     fprintf(stderr, "we\n");
  75.     if (argc > 3)
  76.     expt2 = atof(argv[3]);
  77.     if (midpt == UNDEFFLOAT) {
  78.     midfract = 1;
  79.     midpt = .5;
  80.     }
  81.     rc = hd.orows * hd.ocols;
  82.     if (form == PFBYTE) {
  83.     pic = (unsigned char *) halloc(rc, sizeof(unsigned char));
  84.     if (fread(pic, rc * sizeof(unsigned char), 1, stdin) != 1 )
  85.         perr(HE_MSG, "error during read");
  86.     get_maxb(rc);
  87.     printf("%d\n", mval);
  88.     printf("%d\n", form);
  89.     fprintf(stderr, "go\n");
  90.     make_byte_lut();
  91.     } else if (form == PFSHORT) {
  92.     spic = (short *) halloc(rc, sizeof(short));
  93.     if (fread(spic, rc * sizeof(unsigned short), 1, stdin) != 1 )
  94.         perr(HE_MSG, "error during read");
  95.     get_maxs(rc);
  96.     printf("%d\n", mval);
  97.     form = PFSHORT;
  98.     printf("%d\n", form);
  99.     make_short_lut();
  100.     } else
  101.     perr(HE_MSG, "input format must be byte or short format");
  102.     return (0);
  103. }
  104.  
  105. make_byte_lut()
  106. {
  107.     int       i;
  108.     double    newpt, s1, s2, dtmp, dstmp;
  109.     unsigned char entry;
  110.  
  111.     if (midfract)
  112.     midpt = midpt * mval;
  113.     fprintf(stderr, "stretchtbl: midpoint = %f\n", midpt);
  114.     s1 = pow(midpt, (1. - expt1));
  115.     s2 = pow((255. - midpt), 1. - expt2);
  116.  
  117.     for (i = 1; i < 256; i++) {
  118.     dtmp = i;
  119.     if (dtmp == 0.)
  120.         newpt = 0.;
  121.     else if (dtmp <= midpt)
  122.         newpt = s1 * pow(dtmp, expt1);
  123.     else {
  124.         dstmp = dtmp - midpt;
  125.         if (dstmp < 0)
  126.         newpt = midpt;
  127.         else
  128.         newpt = midpt + pow(dstmp, expt2) * s2;
  129.     }
  130.     entry = (unsigned char) (newpt + 0.5);
  131.     printf("%d\n", entry);
  132.     }
  133. }
  134.  
  135. get_maxb(size)
  136.     int       size;
  137. {
  138.     register int i;
  139.     unsigned char *ppic;
  140.  
  141.     mval = 0;
  142.     ppic = pic;
  143.     for (i = 0; i < size; i++) {
  144.     if (*ppic > mval)
  145.         mval = *ppic;
  146.     ppic++;
  147.     }
  148.     fprintf(stderr, "Maximum value is: %d \n", mval);
  149. }
  150.  
  151. get_maxs(size)
  152.     int       size;
  153. {
  154.     register int i;
  155.     short    *pspic;
  156.  
  157.     mval = 0;
  158.     pspic = spic;
  159.     for (i = 0; i < size; i++) {
  160.     if (*pspic > mval)
  161.         mval = *pspic;
  162.     pspic++;
  163.     }
  164.     fprintf(stderr, "Maximum value is: %d \n", mval);
  165. }
  166.  
  167. make_short_lut()
  168. {
  169.     int       i;
  170.     double    newpt, endpt_scale1, endpt_scale2, dtmp, dstmp;
  171.     short     entry;
  172.  
  173.     if (midfract)
  174.     midpt = midpt * mval;
  175.     fprintf(stderr, "stretchtbl: midpoint = %f\n", midpt);
  176.     endpt_scale1 = pow(midpt, (1. - expt1));
  177.     endpt_scale2 = pow(((float) MAXSHORT - midpt), 1. - expt2);
  178.  
  179.     for (i = 1; i <= mval; i++) {
  180.     dtmp = i;
  181.     if (dtmp == 0.)
  182.         newpt = 0.;
  183.     else if (dtmp <= midpt)
  184.         newpt = endpt_scale1 * pow(dtmp, expt1);
  185.     else {
  186.         dstmp = dtmp - midpt;
  187.         newpt = endpt_scale2 * pow(dstmp, expt2) + midpt;
  188.     }
  189.     entry = (short) (newpt + 0.5);
  190.     if (entry < 0)
  191.         entry = 0;
  192.     printf("%d\n", entry);
  193.     }
  194. }
  195.